package com.java.api;


import com.alibaba.fastjson.JSONObject;
import com.java.config.result.Result;
import com.java.common.helper.JwtHelper;
import com.java.model.user.UserInfo;
import com.java.service.UserInfoService;
import com.java.utils.HttpClientUtils;
import com.java.utils.WxPropertiesUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
//HttpClientUtils : 伪请求接口 获取信息
//微信操作的接口
@Controller//为了我们跳转更加方便
@RequestMapping("/api/ucenter/wx")
public class WeixApiController {

    @Autowired
    private UserInfoService userInfoService;

    //1、生成微信扫描二维码 是由前端生成二维码
    //获取微信参数
    @GetMapping("/getLoginParam")
    @ResponseBody
    public Result getQrConnect(){
        try {
            //微信的参数 appid redirectUri   scope
            Map<String, Object> map = new HashMap<>();
            map.put("appid", WxPropertiesUtils.WX_OPEN_APP_ID);
            map.put("scope", "snsapi_login");
            String redirectUrl = WxPropertiesUtils.WX_OPEN_REDIRECT_URL;
            //redirectUrl 进行编码编码
            redirectUrl = URLEncoder.encode(redirectUrl, "utf-8");
            map.put("redirectUri", redirectUrl);
//            map.put("redirectUri", "snsapi_login");
            return Result.ok(map);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }


    //2、回调 返回用户信息
    //微信扫描之后的回调方法
    @GetMapping("/callback")
    public String callback(String code,String state){
        //获取微信扫码人信息
        //1、获取到临时票据
        System.out.println("code:"+code);
        //2、拿着code和微信id和秘钥，请求微信固定地址，得到两个值
        //使用code和appid以及appscrect换取access_token  %s相当于 sql 中的? 字符串占位符
        StringBuffer baseAccessTokenUrl = new StringBuffer()
                .append("https://api.weixin.qq.com/sns/oauth2/access_token")
                .append("?appid=%s")
                .append("&secret=%s")
                .append("&code=%s")
                .append("&grant_type=authorization_code");
        //通过args来替换 %s   String.format(obj,...arg)
        String accessTokenUrl = String.format(baseAccessTokenUrl.toString(),
                WxPropertiesUtils.WX_OPEN_APP_ID,
                WxPropertiesUtils.WX_OPEN_APP_SECRET,
                code);
        //最有是由微信的这个地址返回信息
        //使用HttpClientUtils请求这个地址
        try {
            //请求 accessTokenUrl 这个地址
            //返回的是{appid:"xx",token:"xxx"}的字符串 我们需要把他转换成 json
            String accesstokenInfo = HttpClientUtils.get(accessTokenUrl);

            JSONObject jsonObject = JSONObject.parseObject(accesstokenInfo);
            String access_token = jsonObject.getString("access_token");
            String openid = jsonObject.getString("openid");
            //3、拿着access_token 和 openid 来请求微信地址 得到扫码人的信息
            //根据access_token获取微信用户的基本信息
            //TODO 先根据openid进行数据库查询
             UserInfo userInfo = userInfoService.getByOpenid(openid);
            // 如果没有查到用户信息,那么调用微信个人信息获取的接口
             if(null == userInfo) {
                 //如果查询到个人信息，那么直接进行登录
                 //使用access_token换取受保护的资源：微信的个人信息
                 //  需要请求的地址：baseUserInfoUrl
                 String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                         "?access_token=%s" +
                         "&openid=%s";
                 String userInfoUrl = String.format(baseUserInfoUrl, access_token, openid);
                 //得到扫码人的信息
                 String resultInfo = HttpClientUtils.get(userInfoUrl);
                 //得到用户json数据
                 JSONObject resultUserInfoJson = JSONObject.parseObject(resultInfo);
                 //用户名 昵称 用户头像
                 String nickname = resultUserInfoJson.getString("nickname");
                 String headingimgurl = resultUserInfoJson.getString("headingimgurl");
                 //将信息添加到数据库
                 userInfo = new UserInfo();
                 userInfo.setNickName(nickname);
                 userInfo.setOpenid(openid);
                 userInfo.setStatus(1);
                 userInfoService.save(userInfo);
                 Map<String, String> map = new HashMap<>();
                 String name = userInfo.getName();
                 if (StringUtils.isEmpty(name)) {
                     name = userInfo.getNickName();
                 }
                 if (StringUtils.isEmpty(name)) {
                     name = userInfo.getPhone();
                 }
                 map.put("name", name);

                 //判断是否绑定手机号 如果手机号为空则返回openid
                 //前端判断 如果openid为空不需要绑定手机号 openid不为空则绑定手机号
                 if (StringUtils.isEmpty(userInfo.getPhone())) {
                     map.put("openid", userInfo.getOpenid());
                 } else {
                     map.put("openid", "");
                 }
                 //登录后返回token字符串
                 String token = JwtHelper.createToken(userInfo.getId(), name);
                 map.put("token", token);
                 //返回前端地址进行跳转
                 return "redirect:"+WxPropertiesUtils.YYGH_BASE_URL+"/weixin/callback?token="+map.get("token")+
                         "&openid="+map.get("openid")+"&name="+URLEncoder.encode((String)map.get("name"),"utf-8");
             }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return "";
    }

}
